/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.dao.implementaciones;

import desarrollosoft.ghce.dao.interfaces.IEspecialidadDAO;
import desarrollosoft.ghce.entidades.Especialidad;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author ariel
 */
@Repository("especialidadDAO")
public class EspecialidadDAO implements IEspecialidadDAO {

    @PersistenceContext
    EntityManager entityManager;
    
    @Override
    public List<Especialidad> buscarTodasEspecialidades() {
        Query query = entityManager.createQuery("SELECT e FROM Especialidad e ORDER BY e.nombre ASC");
        return query.getResultList();
    }

    @Override
    public List<Especialidad> buscarPorNombre(String nombre) {
        Query query = entityManager.createQuery("SELECT e FROM Especialidad e "
                + "WHERE e.nombre LIKE CONCAT (:nombre,'%') ORDER BY e.nombre ASC");
        query.setParameter("nombre", nombre);
        return query.getResultList();
    }

    @Override
    @Transactional(propagation = Propagation.MANDATORY)
    public void modificarEspecialidad(Especialidad especialidad) {
        entityManager.merge(especialidad);
    }

    @Override
    @Transactional(propagation = Propagation.MANDATORY)
    public void crearEspecialidad(Especialidad especialidad) {
        entityManager.persist(especialidad);
    }

    @Override
    @Transactional(propagation = Propagation.MANDATORY)
    public void eliminarEspecialidad(Especialidad especialidad) {
        entityManager.remove( entityManager.merge(especialidad) );
    }

    @Override
    public boolean existeEspecialidadConNombre(String nombreMayusculas) {
        Query consulta = entityManager.createQuery(
                "SELECT e FROM Especialidad e WHERE UPPER(e.nombre) = :nombreMayusculas"
        );
        consulta.setParameter("nombreMayusculas", nombreMayusculas);
        List<Especialidad> lista = consulta.getResultList();
        if (lista.isEmpty()) {
            return false;
        }
        return true;
    }

    @Override
    public boolean existeEspecialidadConMismoNombreYdiferenteId(Long id, String nombreMayusculas) {
        Query consulta = entityManager.createQuery(
                "SELECT e FROM Especialidad e WHERE UPPER(e.nombre) = :nombreMayusculas "
                        + "AND e.id != :id"
        );
        consulta.setParameter("nombreMayusculas", nombreMayusculas);
        consulta.setParameter("id", id);
        List<Especialidad> lista = consulta.getResultList();
        if (lista.isEmpty()) {
            return false;
        }
        return true;
    }
    
}
